package com.powernode.config;

import com.powernode.constant.Constants;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 订单处理RabbitMQ配置类
 * 用于秒杀成功后即时订单的异步处理
 * 与 DelayRabbitConfig 配合形成完整的订单生命周期管理（即时处理+超时处理）
 */
@Configuration
public class OrderRabbitConfig {
    /**
     * 声明订单处理交换机（直接交换机）
     * 用于接收秒杀成功后的即时订单消息
     */
    @Bean
    public DirectExchange orderExchange() {
        /**
         * 创建直接交换机参数说明：
         * 1. 交换机名称：Constants.EXCHANGE_NAME_ORDER（从常量类获取，通常为 "exchange.order.direct"）
         * 2. durable: true - 持久化交换机，服务重启后不丢失
         * 注意：此交换机为普通direct类型，与延迟交换机（x-delayed-message）区分
         */
        return ExchangeBuilder.directExchange(Constants.EXCHANGE_NAME_ORDER).durable(true).build();
    }

    /**
     * 声明订单处理队列
     * 用于存储待处理的秒杀成功订单
     */
    @Bean
    public Queue orderQueue() {
        /**
         * 创建队列参数说明：
         * 1. 队列名称：Constants.QUEUE_NAME_ORDER（从常量类获取，通常为 "queue.order.process"）
         * 2. durable: true - 持久化队列，确保消息在服务重启后不丢失
         * 此队列接收两种来源的消息：
         *   a. 秒杀成功后直接发送的即时订单消息
         *   b. 延迟队列超时后转发的死信消息（如超时未支付订单）
         */
        return QueueBuilder.durable(Constants.QUEUE_NAME_ORDER).build();
    }

    /**
     * 绑定订单队列到订单交换机
     * 建立交换机、路由键与队列的固定映射关系
     */
    @Bean
    public Binding orderBinding() {
        /**
         * 绑定关系说明：
         * 1. 将 orderQueue() 队列绑定到 orderExchange() 交换机
         * 2. 使用路由键 Constants.ROUTING_KEY_ORDER（通常为 "key.order.process"）
         * 注意：
         *   - 此路由键需与消息发送方（如 SeckillController）使用的路由键保持一致
         *   - 延迟队列的死信路由键也需设置为此值，才能将超时消息转发到该队列
         */
        return BindingBuilder.bind(orderQueue()).to(orderExchange()).with(Constants.ROUTING_KEY_ORDER);
    }
}
